#include <iostream>

/**
 * C++虚函数
 *
 * 虚函数是在基类中使用关键字 virtual 声明的函数
 *
 * 虚函数允许子类重写它，从而在运行时通过基类指针或调用子类的重写版本，实现动态绑定。
 * 我们想要的时在程序中任意点可以根据所调用的对象类型來选择调用的函数，这种操作被称为动态链接，或后期绑定。
 *
 * 特点：
 * 1. 在基类中可以有实现： 通常虚函数在基类中提供默认实现，但子类可以选择重写。
 * 2. 动态绑定： 在运行时根据对象的实际类型调用相应的函数版本。
 * 3. 可选重写： 派生类可以选择性的重写虚函数，但不是必须。
 *
 */

class Animal{
public:
    //虚函数
    virtual void sound(){
        std::cout << "Animal make a sound" << std::endl;
    }
};

class Dog: public Animal{
public:
    void sound() override{
        std::cout << "Dog barks" <<  std::endl;
    }
};

int main() {
    Animal *animal = new Dog();
    animal->sound();
    delete animal;
    return 0;
}
